package com.kaizen.leet78;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 78. 子集
 * 给定一组不含重复元素的整数数组 nums，返回该数组所有可能的子集（幂集）。
 *
 * 说明：解集不能包含重复的子集。
 *
 * 示例:
 *
 * 输入: nums = [1,2,3]
 * 输出:
 * [
 *   [3],
 *   [1],
 *   [2],
 *   [1,2,3],
 *   [1,3],
 *   [2,3],
 *   [1,2],
 *   []
 * ]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/subsets
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @author kaizen
 * @date 2020/6/13 20:22
 */
public class SolutionKaizen {

    public static void main(String[] args) {
        System.out.println(subsets(new int[] { 1, 2, 3}));
    }

    /**
     * 从头遍历，遇到一个数就把所有子集加上该数组成新的子集，遍历完毕即是所有子集
     * @param nums
     * @return
     */
    public static List<List<Integer>> subsets(int[] nums) {
        if (nums == null) {
            return null;
        }
        List<List<Integer>> res = new ArrayList<>();
        // 空集
        res.add(new ArrayList<>(0));
        int length = nums.length;
        for (int i = 0; i < length; i++) {
            List<List<Integer>> subList = new ArrayList<>();
            for (List<Integer> beforeRes : res) {
                List<Integer> currRes = new ArrayList<>(beforeRes);
                currRes.add(nums[i]);
                subList.add(currRes);
            }
            res.addAll(subList);
        }
        return res;
    }
}
